package com.zhiche.lisa.bms.service.bill;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.zhiche.lisa.bms.dao.model.bill.Bill;
import com.zhiche.lisa.bms.dao.model.bill.BillIoDetail;
import com.zhiche.lisa.bms.pojo.vo.bill.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 应收账单 服务类
 * </p>
 *
 * @author liuanshun
 * @since 2018-09-06
 */
public interface BillService extends IService<Bill> {

    /**
     * 新增
     *
     * @param bill
     * @return
     */
    Bill insertBillOne(Bill bill);

    /**
     * 应收账单分页数据
     *
     * @param inPage
     * @return
     */
    Page<BillVO> selectIncomingPage(Page<Bill> inPage);

    /**
     * 应付账单分页数据
     *
     * @param inPage
     * @return
     */
    Page<BillVO> selectPurchasePage(Page<Bill> inPage);

    /**
     * 获取支付申请对应的应付出账
     *
     * @param payId
     * @return
     */
    List<Bill> queryBillPurchaseList(Long payId);

    /**
     * 应收账单数据集合
     *
     * @param condition
     * @return
     */
    List<BillVO> selectIncomingList(Map<String, Object> condition);

    /**
     * 应付账单数据集合
     *
     * @param condition
     * @return
     */
    List<BillVO> selectPurchaseList(Map<String, Object> condition);

    /**
     * 获取对比后的应收账单信息
     *
     * @param page
     * @return
     */
    Page<BillReconciliationVO> queryReconciliationPage(Page page);

    /**
     * 获取对比后的应收账单列表信息
     *
     * @param billId
     * @return
     */
    List<BillReconciliationVO> queryReconciliationList(Long billId);

    /**
     * 获取对比后的应收账单列表信息
     *
     * @param billId
     * @param billIoDetails
     * @return
     */
    BillReconciliationAndSunVO queryReceivableReconciliation(String billId, List<BillIoDetail> billIoDetails);

    /**
     * 获取对比后的应付账单列表信息
     *
     * @param page
     * @param billId
     * @param bingUnCheckFee
     * @param isBindReceivable
     * @return
     */
    List<BillReconciliationVO> queryPayableReconciliationList(List<CustomerBillVO> page, String billId, boolean bingUnCheckFee, boolean isBindReceivable);

    /**
     * 获取账单头信息
     *
     * @param billIoId
     * @return
     */
    BillHeaderVO queryBillHeader(String billIoId);

    /**
     * 账单异常回调数据处理
     *
     * @param billId
     * @param billReconciliationVOS
     */
    void billErrorCallback(String billId, List<BillReconciliationVO> billReconciliationVOS);

    /**
     * 应付账单确认
     *
     * @param billId
     */
    void payableBillConfirm(String billId);

    /**
     * 应付账单异常
     *
     * @param billReconciliationVOS
     * @param billId
     */
    void payableBillException(List<BillReconciliationVO> billReconciliationVOS, String billId);

    /**
     * 新增
     *
     * @param inbill
     * @param ids
     */
    void insertBillAndDetail(Bill inbill, List<Long> ids);

    /**
     * 修改审核状态
     *
     * @param billCode
     * @param isAffirm
     */
    void updateBillAffirmState(String billCode, Integer isAffirm);

    /**
     * 根据id修改扣款总金额
     *
     * @param id
     * @param deductSum
     */
    void updateBillAffirmDeductSum(Long id, BigDecimal deductSum);

    /**
     * 根据应付账款生成应付账单
     *
     * @param feePayableIds
     * @param type
     * @return
     */
    List<Bill> createBillByFeePayable(List<Long> feePayableIds, String type);

    /**
     * 修改账单状态
     * 根据账单code修改对应信息的状态
     *
     * @param billCode
     * @param billStatus
     */
    void updateBillIo(String billCode, String billStatus);

    /**
     * 根据账单ID得到账单信息和应收账款信息
     * 获取账单对应账款详明
     *
     * @param id
     * @return
     */
    BillFeeDetailVO getBillIdToAnBilldFee(String id);

    /**
     * 根据账单ID得到账单信息和应收账款信息
     * 获取账单对应账款详明
     *
     * @param idList
     * @return
     */
    List<BillFeeDetailVO> getBillIdToAnBilldFeeList(List<Long> idList);

    /**
     * 根据对应客户账单code获取对应账单信息
     *
     * @param codes
     * @return
     */
    List<Bill> selectBillListByCustomerBillCode(List<String> codes);

    /**
     * 批量确认账单
     *
     * @param idList
     */
    void batchConfirmBill(List<Long> idList);

    /**
     * 批量删除账单
     *
     * @param idList
     */
    void reset(List<Long> idList, int resetType);

    /**
     * 锁定账单
     *
     * @param idList
     */
    void lockBill(List<Long> idList);

    /**
     * 清除锁定
     *
     * @param idList
     */
    void cleanLockBill(List<Long> idList);

    /**
     * 计算合同比例和金额
     *
     * @param bill
     * @return
     */
    BigDecimal computeContractMoney(Bill bill);

    /**
     * 撤销删除账单
     *
     * @param billList
     */
    void callBackDelBill(List<Bill> billList);

    /**
     * 获取账单下的所有对应的运单号
     *
     * @param billIdList
     * @return
     */
    List<String> getBillSysWaybillId(List<Long> billIdList);
}
